/*!
 * \file WtBtDtReader.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader回测数据读取器头文件
 * 
 * \details 该文件定义了WtBtDtReader回测数据读取器类，提供了回测引擎专用的数据读取功能。
 *          主要特点包括：
 *          - 继承自IBtDtReader接口，提供标准化的回测数据读取接口
 *          - 支持原始K线数据和Tick数据的读取功能
 *          - 专为回测环境设计，优化数据读取性能
 *          - 支持多种时间周期的K线数据读取
 *          - 支持指定日期的历史Tick数据读取
 *          - 提供数据文件格式验证和错误处理机制
 */
#pragma once
#include <string>
#include <stdint.h>

#include "DataDefine.h"

#include "../Includes/FasterDefs.h"
#include "../Includes/IBtDtReader.h"

#include "../Share/BoostMappingFile.hpp"
#include "../Share/StdUtils.hpp"

NS_WTP_BEGIN
class WTSVariant;
class WTSTickSlice;
class WTSKlineSlice;
class WTSOrdDtlSlice;
class WTSOrdQueSlice;
class WTSTransSlice;
class WTSArray;

class IBaseDataMgr;
class IHotMgr;
typedef std::shared_ptr<BoostMappingFile> BoostMFPtr;

/*!
 * \class WtBtDtReader
 * \brief WonderTrader回测数据读取器
 * 
 * \details 该类实现了IBtDtReader接口，专门为回测引擎提供历史数据读取功能。
 *          主要功能包括：
 *          - 从磁盘文件读取原始K线数据
 *          - 从磁盘文件读取原始Tick数据
 *          - 支持多种数据格式的解析和处理
 *          - 提供数据文件路径管理和访问控制
 *          - 集成数据压缩和解压缩功能
 *          - 提供完整的错误处理和日志记录机制
 * 
 * \note 该类专为回测环境设计，不适用于实时交易数据读取
 * \note 支持的数据格式为WonderTrader标准的DSB格式文件
 * 
 * \see IBtDtReader
 */
class WtBtDtReader : public IBtDtReader
{
public:
	/*!
	 * \brief 构造函数
	 * 
	 * 初始化回测数据读取器实例
	 */
	WtBtDtReader();
	
	/*!
	 * \brief 析构函数
	 * 
	 * 清理资源并释放内存
	 */
	virtual ~WtBtDtReader();	

//////////////////////////////////////////////////////////////////////////
//IBtDtReader接口实现
public:
	/*!
	 * \brief 初始化回测数据读取器
	 * \param cfg 配置参数，包含数据路径等配置信息
	 * \param sink 回测数据读取器回调接口，用于日志输出等
	 * 
	 * \details 根据配置参数初始化数据读取器，设置数据根目录路径。
	 *          配置参数中的"path"字段指定了历史数据文件的根目录位置。
	 */
	virtual void init(WTSVariant* cfg, IBtDtReaderSink* sink) override;

	/*!
	 * \brief 读取原始K线数据
	 * \param exchg 交易所代码
	 * \param code 合约代码
	 * \param period K线周期类型
	 * \param buffer 输出缓冲区，存储读取的原始数据
	 * \return 是否读取成功
	 * 
	 * \details 从指定路径读取历史K线数据文件，支持多种周期类型。
	 *          数据文件路径格式：{base_dir}/his/{period}/{exchg}/{code}.dsb
	 *          读取的数据会经过解压缩和格式处理后存储到buffer中。
	 */
	virtual bool read_raw_bars(const char* exchg, const char* code, WTSKlinePeriod period, std::string& buffer) override;
	
	/*!
	 * \brief 读取原始Tick数据
	 * \param exchg 交易所代码
	 * \param code 合约代码
	 * \param uDate 交易日期（格式：YYYYMMDD）
	 * \param buffer 输出缓冲区，存储读取的原始数据
	 * \return 是否读取成功
	 * 
	 * \details 从指定路径读取历史Tick数据文件。
	 *          数据文件路径格式：{base_dir}/his/ticks/{exchg}/{uDate}/{code}.dsb
	 *          读取的数据会经过解压缩和格式处理后存储到buffer中。
	 */
	virtual bool read_raw_ticks(const char* exchg, const char* code, uint32_t uDate, std::string& buffer) override;

private:
	std::string		_base_dir;	///< 数据文件根目录路径
};

NS_WTP_END